/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package models.negocio;

import config.LogErro;
import controllers.JdbcDimController;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import models.dados.HibernateDAO;
import models.dados.HibernateUtil;
import models.entidades.AtributoDimensao;
import models.entidades.ComportamentoAtributo;
import models.entidades.Dimensao;
import models.entidades.Procedimento;
import models.entidades.Referencia;
import models.entidades.RestricaoNulidade;
import models.entidades.TabAux;
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import org.hibernate.transform.AliasToBeanResultTransformer;
import views.utilitario.AtributosDimSem;
import views.utilitario.ReferenciaAtributos;

/**
 *
 * @author Wenderson
 */
public class NegocioDimensao extends HibernateDAO<Dimensao, Integer> {

    enum Auditoria {CHAVE_NATURAL, SURROGATE_KEY, DATA_INICIAL, DATA_FINAL, FL_CORRENTE};
    
    public NegocioDimensao() {
        super(Dimensao.class);
    }
    
    public boolean inserir(ArrayList<AtributosDimSem> dimensao) {
        try {
            HibernateUtil.beginTransaction();
            
            Dimensao d = new Dimensao();
            d.setEsquema(dimensao.get(0).getSchema());
            d.setNome(dimensao.get(0).getNomeTabela());
            
            HibernateUtil.getSession().save(d);
            
            HibernateUtil.getSession().flush();
            System.out.println("CD DIMENSAO: " + d.getCdDimensao());
            
            for (AtributosDimSem atrSem : dimensao) {
                AtributoDimensao atrDim = atrSem.getAtributoDim();
                atrDim.setDimensao(d);
                
                HibernateUtil.getSession().save(atrDim);
                
                HibernateUtil.getSession().flush();
                System.out.println("CD AT DIMENSAO: " + atrDim.getCdAtDimensao());
                
                if (atrDim.getCdAtDimensao() == -1) {
                    return false;
                }
                
                if (atrSem.isChaveNatural()) {
                    this.inserirAuditoria(d.getCdDimensao(), atrDim.getCdAtDimensao(), Auditoria.CHAVE_NATURAL);
                }
                
                if (atrSem.isSurrogateKey()) {
                    this.inserirAuditoria(d.getCdDimensao(), atrDim.getCdAtDimensao(), Auditoria.SURROGATE_KEY);
                }
                
                if (atrSem.getAuditoria().equalsIgnoreCase("DATA_INICIAL")) {
                    this.inserirAuditoria(d.getCdDimensao(), atrDim.getCdAtDimensao(), Auditoria.DATA_INICIAL);
                } else if (atrSem.getAuditoria().equalsIgnoreCase("DATA_FINAL")) {
                    this.inserirAuditoria(d.getCdDimensao(), atrDim.getCdAtDimensao(), Auditoria.DATA_FINAL);
                } else if (atrSem.getAuditoria().equalsIgnoreCase("FL_CORRENTE")) { // FL CORRENTE
                    this.inserirAuditoria(d.getCdDimensao(), atrDim.getCdAtDimensao(), Auditoria.FL_CORRENTE);
                }
            }
            
            HibernateUtil.commitTransaction();
            
            return true;
        } catch (Exception e) {
            HibernateUtil.rollBackTransaction();
            LogErro.gravaErro(e);e.printStackTrace();
        }
        return false;
    }
    
    private boolean inserirAuditoria(int cd_dimensao, int cd_at_dimensao, Auditoria auditoria) throws Exception {
        String tabela = "";
        
        switch (auditoria) {
            case CHAVE_NATURAL: tabela = "CHAVE_NATURAL_DIM"; break;
            case SURROGATE_KEY: tabela = "SURROGATE_KEY"; break;
            case DATA_INICIAL: tabela = "DATA_INICIAL"; break;
            case DATA_FINAL: tabela = "DATA_FINAL"; break;
            case FL_CORRENTE: tabela = "FL_CORRENTE"; break;
        }
        
        try {
            Query query = HibernateUtil.getSession().createSQLQuery("INSERT INTO " + tabela + " (CD_DIMENSAO, CD_AT_DIMENSAO) VALUES (?,?)");
            query.setInteger(0, cd_dimensao);
            query.setInteger(1, cd_at_dimensao);

            int resultado = query.executeUpdate();
            
            if (resultado > 0) {
                return true;
            }

        } catch (Exception e) {
            LogErro.gravaErro(e);e.printStackTrace();
        }
        throw new Exception("Erro ao inserir auditoria");
    }
    
    public ArrayList<ReferenciaAtributos> getAtributosDim(int codigo_tabela) {
        try {
            ArrayList<ReferenciaAtributos> lista = new ArrayList<ReferenciaAtributos>();
            
            HibernateUtil.getSession().beginTransaction();
            
            Dimensao dimensao = (Dimensao) HibernateUtil.getSession().load(Dimensao.class, codigo_tabela);
            
            Collection c = dimensao.getAtributoDimensaos_3();
            
            for (Iterator it = c.iterator(); it.hasNext();) {
                AtributoDimensao atr = (AtributoDimensao)it.next();
                
                ReferenciaAtributos ref = new ReferenciaAtributos();
                ref.setCodigo(atr.getCdAtDimensao());
                ref.setNome(atr.getNome());
                ref.setTipo(atr.getTipoDado());
                
                lista.add(ref);
            }

            return lista;
        } catch (Exception e) {
            LogErro.gravaErro(e);e.printStackTrace();
        }
        return null;
    }
    
    public static void main(String[] args) {
        List<Dimensao> lista = NegFact.getDimensao().listAll();
        
        //NegocioAtributoDim negAtrDim = new NegocioAtributoDim();
        
        System.out.println();
        
        for (Iterator<Dimensao> it = lista.iterator(); it.hasNext();) {
            Dimensao dimensao = it.next();
            System.out.println(dimensao.getNome());
        }
        
        NegFact.getDimensao().teste();
    }
    
    public static void teste() {
        //TODO: REMOVER
        //HibernateUtil.beginTransaction();
        
        System.out.println(JdbcDimController.count("BD_CONCESSIONARIA.DBO", "TB_LOJA"));
        
//        Query q1 = HibernateUtil.getSession().createSQLQuery("INSERT INTO DATA_INICIAL (CD_DIMENSAO, CD_AT_DIMENSAO) VALUES (?,?)");
//        q1.setInteger(0, 3);
//        q1.setInteger(1, 18);
//        q1.executeUpdate();
//        
//        HibernateUtil.commitTransaction();
//        
//        Query q = HibernateUtil.getSession().createSQLQuery("SELECT * FROM DATA_INICIAL");
//        List l = q.list();
//        
//        for (Iterator it = l.iterator(); it.hasNext();) {
//            Object[] object = (Object[]) it.next();
//            
//            System.out.println(object[0].toString() + " " + object[1].toString());
//        }
        
//        Dimensao d= new Dimensao();
//        d.setEsquema("teste");
//        d.setNome("teste");
//        
//        HibernateUtil.getSession().save(d);
//        
//        HibernateUtil.getSession().flush();
//        
//        int linha = d.getCdDimensao();
//        
//        System.out.println("LINHAS AFETADAS: " + linha);
        
        //HibernateUtil.commitTransaction();
    }
}

